home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / Development / PowerD / powerd / examples / LineIntersection.d < prev    next >
Text File  |  2002-10-28  |  3KB  |  119 lines

  1. // LineIntersection.d - example of how to get intersection of two lines
  2. // requires workbench height of atleast ~340 pixels and fpu
  3.  
  4. MODULE    'intuition/intuition',
  5.             'utility/tagitem'
  6.  
  7. PROC main()
  8.     DEF    w:PTR TO Window,class,change=FALSE,code,x,y
  9.     DEF    id=-1,drag:PTR TO xy
  10.     IF w:=OpenWindowTags(NIL,
  11.             WA_InnerWidth,320,
  12.             WA_InnerHeight,320,
  13.             WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_MOUSEBUTTONS|IDCMP_MOUSEMOVE,
  14.             WA_Flags,WFLG_DRAGBAR|WFLG_GIMMEZEROZERO|WFLG_RMBTRAP|WFLG_ACTIVATE|WFLG_CLOSEGADGET|WFLG_DEPTHGADGET|WFLG_REPORTMOUSE,
  15.             WA_Title,'Line intersection',
  16.             TAG_END)
  17.  
  18.         drag:=[            // draggable points    A+
  19.             -90,-90,        // position of point A   \  +D
  20.             +90,+90,        // position of point B    \/____this is the point we want to find
  21.             +90,-90,        // position of point C    /\
  22.             -90,+90        // position of point D  C+  +B
  23.             ]:xy
  24.  
  25.         draw    // watch the definition below
  26.  
  27. //        EasyRequestArgs(0,[SIZEOF_EasyStruct,0,0,'Drag those points and enjoy :)','Yea']:EasyStruct,0,NIL)
  28.  
  29.         WHILE (class,code:=WaitIMessage(w))<>IDCMP_CLOSEWINDOW
  30.             SELECT class
  31.             CASE IDCMP_MOUSEBUTTONS
  32.                 SELECT code
  33.                 CASE SELECTDOWN
  34.                     x:=w.GZZMouseX-160
  35.                     y:=w.GZZMouseY-160
  36.                     IF (id:=Drag(x,y,drag,4))>=0 THEN change:=TRUE
  37.                 DEFAULT
  38.                     id:=-1
  39.                 ENDSELECT
  40.             CASE IDCMP_MOUSEMOVE
  41.                 IF id>=0
  42.                     x:=w.GZZMouseX-160
  43.                     y:=w.GZZMouseY-160
  44.                     drag[id].x:=x
  45.                     drag[id].y:=y
  46.                     change:=TRUE
  47.                 ENDIF
  48.             ENDSELECT
  49.         NEXTIF change=FALSE
  50.             draw    // watch the definition below
  51.             change:=FALSE
  52.         ENDWHILE
  53.  
  54.         CloseWindow(w)
  55.     ENDIF
  56.  
  57.     SUB draw        // this is new feature from v0.16 of PowerD :)
  58.         SetRast(w.RPort,0)
  59.         DrawLine(w.RPort,drag[0].x,drag[0].y,drag[1].x,drag[1].y)
  60.         DrawLine(w.RPort,drag[2].x,drag[2].y,drag[3].x,drag[3].y)
  61.         x,y:=LineIntersection(
  62.             drag[0].x,drag[0].y,
  63.             drag[1].x,drag[1].y,
  64.             drag[2].x,drag[2].y,
  65.             drag[3].x,drag[3].y)
  66.         DrawCross(w.RPort,x,y)
  67.     ENDSUB
  68.  
  69. ENDPROC
  70.  
  71. OBJECT xy
  72.     x/y:L
  73.  
  74. PROC LineIntersection(xA:F,yA:F,xB:F,yB:F,xC:F,yC:F,xD:F,yD:F)(F,F)
  75.     DEFF    x,y,a1,a2,c1,c2,t
  76.     a1:=xB-xA
  77.     a2:=yB-yA
  78.     c1:=xD-xC
  79.     c2:=yD-yC
  80.     IF (c1*a2-c2*a1)
  81.         t:=(c1*(yC-yA)+c2*(xA-xC))/(c1*a2-c2*a1)
  82.         x:=xA+a1*t
  83.         y:=yA+a2*t
  84.     ENDIF
  85. ENDPROC x,y
  86.  
  87. PROC DrawLine(rp,x1,y1,x2,y2)
  88.     x1+=160
  89.     y1+=160
  90.     x2+=160
  91.     y2+=160
  92.     SetAPen(rp,1)
  93.     Move(rp,x1,y1)
  94.     Draw(rp,x2,y2)
  95.     SetAPen(rp,3)
  96.     RectFill(rp,x1-2,y1-2,x1+2,y1+2)
  97.     RectFill(rp,x2-2,y2-2,x2+2,y2+2)
  98. ENDPROC
  99.  
  100. PROC DrawCross(rp,x,y)
  101.     x+=160
  102.     y+=160
  103.     SetAPen(rp,2)
  104.     Move(rp,x-3,y-3)
  105.     Draw(rp,x+3,y+3)
  106.     Move(rp,x-3,y+3)
  107.     Draw(rp,x+3,y-3)
  108.     DrawEllipse(rp,x,y,4,4)
  109. ENDPROC
  110.  
  111. PROC Drag(x,y,drag:PTR TO xy,count)(L)
  112.     DEF    id
  113.     FOR id:=0 TO count-1
  114.         IF x>=drag[id].x-2 AND x<=drag[id].x+2 AND y>=drag[id].y-2 AND y<=drag[id].y+2 THEN RETURN id
  115.     ENDFOR
  116. ENDPROC -1
  117.  
  118. // MarK 20/10/2000
  119.